package com.seven.desaes;

import com.sun.org.apache.xml.internal.security.utils.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
/**
 * 对称加密
 */
public class DesDemo {

    public static void main(String[] args) throws Exception {
        //原文
        String input = "硅谷";
        //定义key,如果使用des加密，密钥必须是8字节
        String key ="12345678";
        //算法
        String transformation = "DES";
        //加密类型
        String algorithm="DES";
        //调用加密方法获取加密的密文
        String enctyptDEScode = enctyptDES(input, key, algorithm);
        System.out.println("密文="+enctyptDEScode);
        //调用解密方法获取解密的明文
        String decryptDEScode = decryptDES(enctyptDEScode, key, transformation, algorithm);
        System.out.println("原文=" + decryptDEScode);

    }

    /**
     *解密
     * @param enctyptDEScode:加密的密文
     * @param key：密钥
     * @param transformation：加密算法
     * @param algorithm：加密类型
     * @return 明文
     */
    private static String decryptDES(String enctyptDEScode, String key, String transformation, String algorithm) throws Exception {
        Cipher cipher = Cipher.getInstance(transformation);
        /**
         * 创建加密规则
         * 参数一：表示key的字节
         * 参数二：表示加密类型
         */
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),algorithm);
        //Cipher.DECRYPT_MODE表示解密
        cipher.init(Cipher.DECRYPT_MODE,secretKeySpec);
        //解密，传入密文
        byte[] bytes = cipher.doFinal(Base64.decode(enctyptDEScode));
        return  new String(bytes);
    }

    /**
     *加密
     * @param input：明文
     * @param key：密钥
     * @param algorithm：加密类型
     * @return 密文
     */
    private static String enctyptDES(String input, String key, String algorithm) throws Exception {
        //创建加密对象
        Cipher cipher = Cipher.getInstance("DES");
        /**
         * 创建加密规则
         * 参数一：表示key的字节
         * 参数二：表示加密类型
         */
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),algorithm);
        /**
         * 进行加密初始化
         * 参数一：表示模式，加密模式、解密模式
         * 参数二：表示加密的规则
         */
        cipher.init(Cipher.ENCRYPT_MODE,secretKeySpec);
        //调用加密方法
        //参数表示原文的字节数组
        byte[] bytes = cipher.doFinal(input.getBytes());
        //创建base64对象，执行转码
        String encode = Base64.encode(bytes);
        return encode;
        //打印密文
        //直接打印密文会出现乱码
        //System.out.println(encode);
    }
}
